TODO

NA

Dependencies

library(readr)
library(dplyr)
library(tidyr)
library(ggplot2)
library(scales)
library(forcats)
library(effectsize)
library(psych)
library(knitr)
library(kableExtra)
library(janitor)
library(lavaan)
library(tibble)
library(purrr)
library(ggstance)

Load data

data_predictions <- read_csv("../../data/raw/data_predictions.csv")

data_processed <- read_rds("../../data/processed/data_processed.rds") |>
  rename(love = other_evaluations_love,
         murder = other_evaluations_murder,
         vacation = other_evaluations_vacation,
         racist = other_evaluations_racist,
         pedophile = other_evaluations_pedophile,
         shrewd = other_evaluations_shrewd,
         honest = other_evaluations_honest,
         dishonest = other_evaluations_dishonest,
         mcdonalds = other_evaluations_mcdonalds,
         burgerking = other_evaluations_burgerking,
         conservatives = other_evaluations_conservatives,
         liberals = other_evaluations_liberals,
         girls_skirts = other_beliefs_girls_skirts,
         boys_skirts = other_beliefs_boys_skirts,
         cats_legs = other_beliefs_cats_legs,
         fish_legs = other_beliefs_fish_legs)

Exclusions

data_processed |>
  count(attention_check1, 
        attention_check2,
        attention_check3,
        self_exclude,
        bot_check, 
        age_check,
        completeness_check,
        completion_time_check) |>
  arrange(desc(n))
## # A tibble: 15 × 9
##    attention_check1 attention_check2 attention_check3 self_exclude bot_check
##    <chr>            <chr>            <chr>            <chr>        <chr>    
##  1 passed           passed           passed           passed       passed   
##  2 failed           failed           failed           failed       failed   
##  3 failed           failed           failed           failed       failed   
##  4 passed           passed           passed           passed       passed   
##  5 passed           passed           passed           passed       passed   
##  6 passed           passed           failed           passed       passed   
##  7 failed           failed           failed           failed       failed   
##  8 failed           passed           passed           passed       passed   
##  9 passed           failed           failed           failed       passed   
## 10 passed           failed           passed           passed       passed   
## 11 passed           passed           failed           failed       failed   
## 12 passed           passed           failed           failed       failed   
## 13 passed           passed           passed           failed       passed   
## 14 passed           passed           passed           passed       failed   
## 15 passed           passed           passed           passed       passed   
## # ℹ 4 more variables: age_check <chr>, completeness_check <chr>,
## #   completion_time_check <chr>, n <int>
data_exclusions <- data_processed |>
  filter(global_check == "passed") 

write_csv(data_exclusions, "../../data/processed/data_processed_with_exclusions.csv")

# for {effectsize} package
data_exclusions |>
  select(participant_id, gender, ethnicity, country, age, 
         evaluations_poop = classic_poop, 
         evaluations_chocolate = classic_chocolate, 
         evaluations_poop_pos_neg = classic_poop_pos_neg, 
         evaluations_poop_pleasant_unpleasant = classic_poop_pleasant_unpleasant, 
         evaluations_poop_good_bad = classic_poop_good_bad, 
         evaluations_chocolate_pos_neg = classic_chocolate_pos_neg, 
         evaluations_chocolate_pleasant_unpleasant = classic_chocolate_pleasant_unpleasant, 
         evaluations_chocolate_good_bad = classic_chocolate_good_bad) |>
  write_csv("../../data/processed/data_processed_subset_with_exclusions.csv")


ggplot(data_exclusions, aes(completion_time/60)) +
  geom_histogram(binwidth = 1, boundary = 0) +
  xlab("minutes") +
  scale_x_continuous(breaks = scales::breaks_pretty(n = 15), limits = c(0, NA)) +
  geom_vline(xintercept = 2, linetype = "dashed", color = "red") +
  ggtitle("Study completion time in non-excluded participants")

Demographics

data_processed |>
  count(global_check) |>
  mutate(percent = n/sum(n)*100) |>
  mutate_if(is.numeric, round_half_up, digits = 2) |>
  kable() |>
  kable_classic(full_width = FALSE)
global_check n percent
failed 30 5.78
passed 489 94.22
data_exclusions |>
  summarize(n = n(),
            mean_age = mean(age),
            sd_age = sd(age)) |>
  mutate_if(is.numeric, round_half_up, digits = 2) |>
  kable() |>
  kable_classic(full_width = FALSE)
n mean_age sd_age
489 44.9 13.4
data_exclusions |>
  count(gender) |>
  mutate(percent = n/sum(n)*100) |>
  mutate_if(is.numeric, round_half_up, digits = 1) |>
  kable() |>
  kable_classic(full_width = FALSE)
gender n percent
female 264 54.0
male 224 45.8
non-binary 1 0.2
data_exclusions |>
  count(ethnicity) |>
  mutate(percent = n/sum(n)*100) |>
  mutate_if(is.numeric, round_half_up, digits = 1) |>
  kable() |>
  kable_classic(full_width = FALSE)
ethnicity n percent
Asian 17 3.5
Black 25 5.1
Mixed 19 3.9
Other 5 1.0
White 423 86.5
data_exclusions |>
  count(country) |>
  mutate(percent = n/sum(n)*100) |>
  mutate_if(is.numeric, round_half_up, digits = 1) |>
  kable() |>
  kable_classic(full_width = FALSE)
country n percent
United Kingdom 418 85.5
United States 71 14.5

Poop / chocolate

Distributions

data_exclusions_reshaped <- data_exclusions |>
  select(participant_id, 
         desirability_chocolate, 
         desirability_poop,
         classic_chocolate,
         classic_poop,
         original_chocolate,
         original_poop) |>
  pivot_longer(cols = -participant_id,
               names_to = c("scale", "stimulus"),
               names_sep = "_",
               values_to = "response") 

ggplot(data_exclusions_reshaped, aes(response)) +
  geom_histogram(boundary = 0.5, binwidth = 1) +
  scale_x_continuous(limits = c(0.5, 7.5), breaks = 1:7) +
  theme_linedraw() +
  facet_grid(scale ~ stimulus)

data_exclusions_reshaped |>
  group_by(scale, stimulus) |>
  summarize(mean = mean(response),
            sd = sd(response)) |>
  mutate_if(is.numeric, round_half_up, digits = 2) |>
  kable() |>
  kable_classic(full_width = FALSE)
scale stimulus mean sd
classic chocolate 6.44 0.77
classic poop 1.76 0.90
desirability chocolate 6.40 1.01
desirability poop 1.19 0.63
original chocolate 5.52 0.76
original poop 1.99 0.65

Structural validity

cfa_constrained <- function(
    dat, 
    items,
    ordered = FALSE,
    std_lv = TRUE,
    enforce_tau_eq = TRUE,
    thresholds = list(min_std_loading = 0.40, min_r2 = 0.20)
){
  stopifnot(all(items %in% names(dat)))
  if (length(items) < 3) stop("Need ≥ 3 items.")
  
  # --- Model syntax
  load_part <- if (enforce_tau_eq) paste(paste0("a*", items), collapse = " + ")
  else                 paste(items, collapse = " + ")
  mod <- paste0("F =~ ", load_part)
  
  # --- Estimation
  estimator   <- if (ordered) "WLSMV" else "MLR"
  miss        <- if (ordered) "listwise" else "fiml"
  ordered_vec <- if (ordered) items else NULL
  
  fit <- lavaan::cfa(
    model = mod,
    data = dat,
    std.lv = std_lv,
    meanstructure = TRUE,
    estimator = estimator,
    missing = miss,
    ordered = ordered_vec
  )
  
  # --- Global fit indices
  fm <- lavaan::fitMeasures(
    fit,
    c("chisq","df","pvalue","cfi","tli","rmsea",
      "rmsea.ci.lower","rmsea.ci.upper","srmr")
  )
  fit_table <- tibble::enframe(fm, name = "fit_index", value = "value")
  
  # --- Loadings and R²
  loadings <- lavaan::standardizedSolution(fit) |>
    dplyr::filter(op == "=~", lhs == "F", rhs %in% items) |>
    dplyr::transmute(item = rhs, std_loading = est.std)
  
  r2_tbl <- tibble::enframe(lavaan::lavInspect(fit, "r2"),
                            name = "item", value = "R2") |>
    dplyr::filter(item %in% items)
  
  diag <- dplyr::left_join(loadings, r2_tbl, by = "item") |>
    dplyr::mutate(
      flag_loading = std_loading < thresholds$min_std_loading,
      flag_r2      = R2 < thresholds$min_r2,
      flag_any     = flag_loading | flag_r2
    )
  
  list(
    call = match.call(),
    model_syntax = mod,
    fit = fit,
    fit_indices = fit_table,
    item_diagnostics = diag
  )
}

Original

Chocolate

res <- cfa_constrained(data_exclusions, 
                       items = c(
                         "original_chocolate_like",
                         "original_chocolate_attention_capturing",
                         "original_chocolate_unusual",
                         "original_chocolate_figure_out",
                         "original_chocolate_positive",
                         "original_chocolate_fixtated",
                         "original_chocolate_look_away",
                         "original_chocolate_focused",
                         "original_chocolate_negative",
                         "original_chocolate_disgusting",
                         "original_chocolate_appealing",
                         "original_chocolate_eye_catching",
                         "original_chocolate_attractive",
                         "original_chocolate_avoid_looking"
                       ), 
                       ordered = FALSE)

# global fit
res$fit_indices |>
  mutate_if(is.numeric, round_half_up, digits = 2) |>
  kable() |>
  kable_classic(full_width = FALSE)
fit_index value
chisq 1986.10
df 90.00
pvalue 0.00
cfi 0.46
tli 0.46
rmsea 0.21
rmsea.ci.lower 0.20
rmsea.ci.upper 0.22
srmr 0.43
# item diagnostics (loadings, R2, max |std residual|, largest MI, and flags)
res$item_diagnostics |>
  mutate_if(is.numeric, round_half_up, digits = 2) |>
  kable() |>
  kable_classic(full_width = FALSE)
item std_loading R2 flag_loading flag_r2 flag_any
original_chocolate_like 0.73 0.53 FALSE FALSE FALSE
original_chocolate_attention_capturing 0.58 0.34 FALSE FALSE FALSE
original_chocolate_unusual 0.44 0.20 FALSE TRUE TRUE
original_chocolate_figure_out 0.36 0.13 TRUE TRUE TRUE
original_chocolate_positive 0.70 0.49 FALSE FALSE FALSE
original_chocolate_fixtated 0.45 0.21 FALSE FALSE FALSE
original_chocolate_look_away 0.59 0.35 FALSE FALSE FALSE
original_chocolate_focused 0.47 0.22 FALSE FALSE FALSE
original_chocolate_negative 0.71 0.50 FALSE FALSE FALSE
original_chocolate_disgusting 0.71 0.50 FALSE FALSE FALSE
original_chocolate_appealing 0.66 0.43 FALSE FALSE FALSE
original_chocolate_eye_catching 0.61 0.37 FALSE FALSE FALSE
original_chocolate_attractive 0.66 0.44 FALSE FALSE FALSE
original_chocolate_avoid_looking 0.63 0.40 FALSE FALSE FALSE
data_exclusions |>
  select(like = original_chocolate_like,
         attention_capturing = original_chocolate_attention_capturing,
         unusual = original_chocolate_unusual,
         figure_out = original_chocolate_figure_out,
         positive = original_chocolate_positive,
         fixtated = original_chocolate_fixtated,
         look_away = original_chocolate_look_away,
         focused = original_chocolate_focused,
         negative = original_chocolate_negative,
         disgusting = original_chocolate_disgusting,
         appealing = original_chocolate_appealing,
         eye_catching = original_chocolate_eye_catching,
         attractive = original_chocolate_attractive,
         avoid_looking = original_chocolate_avoid_looking) |>
  cor() |>
  round_half_up(2)
##                      like attention_capturing unusual figure_out positive
## like                 1.00                0.58   -0.02       0.31     0.70
## attention_capturing  0.58                1.00    0.06       0.47     0.59
## unusual             -0.02                0.06    1.00       0.18    -0.02
## figure_out           0.31                0.47    0.18       1.00     0.41
## positive             0.70                0.59   -0.02       0.41     1.00
## fixtated             0.52                0.61    0.18       0.56     0.58
## look_away            0.41                0.29   -0.14       0.10     0.37
## focused              0.48                0.55    0.12       0.52     0.55
## negative             0.45                0.30   -0.11       0.14     0.49
## disgusting           0.27                0.14   -0.11       0.03     0.22
## appealing            0.68                0.51   -0.02       0.31     0.62
## eye_catching         0.55                0.73    0.04       0.45     0.56
## attractive           0.58                0.61   -0.02       0.38     0.64
## avoid_looking        0.39                0.25   -0.10       0.11     0.35
##                     fixtated look_away focused negative disgusting appealing
## like                    0.52      0.41    0.48     0.45       0.27      0.68
## attention_capturing     0.61      0.29    0.55     0.30       0.14      0.51
## unusual                 0.18     -0.14    0.12    -0.11      -0.11     -0.02
## figure_out              0.56      0.10    0.52     0.14       0.03      0.31
## positive                0.58      0.37    0.55     0.49       0.22      0.62
## fixtated                1.00      0.22    0.73     0.22       0.10      0.48
## look_away               0.22      1.00    0.23     0.39       0.24      0.36
## focused                 0.73      0.23    1.00     0.27       0.13      0.44
## negative                0.22      0.39    0.27     1.00       0.38      0.30
## disgusting              0.10      0.24    0.13     0.38       1.00      0.27
## appealing               0.48      0.36    0.44     0.30       0.27      1.00
## eye_catching            0.62      0.29    0.56     0.25       0.13      0.60
## attractive              0.57      0.40    0.55     0.31       0.21      0.69
## avoid_looking           0.20      0.52    0.20     0.45       0.30      0.38
##                     eye_catching attractive avoid_looking
## like                        0.55       0.58          0.39
## attention_capturing         0.73       0.61          0.25
## unusual                     0.04      -0.02         -0.10
## figure_out                  0.45       0.38          0.11
## positive                    0.56       0.64          0.35
## fixtated                    0.62       0.57          0.20
## look_away                   0.29       0.40          0.52
## focused                     0.56       0.55          0.20
## negative                    0.25       0.31          0.45
## disgusting                  0.13       0.21          0.30
## appealing                   0.60       0.69          0.38
## eye_catching                1.00       0.77          0.29
## attractive                  0.77       1.00          0.38
## avoid_looking               0.29       0.38          1.00

Poop

res <- cfa_constrained(data_exclusions, 
                       items = c("original_poop_like",
                                 "original_poop_attention_capturing",
                                 "original_poop_unusual",
                                 "original_poop_figure_out",
                                 "original_poop_positive",
                                 "original_poop_fixtated",
                                 "original_poop_look_away",
                                 "original_poop_focused",
                                 "original_poop_negative",
                                 "original_poop_disgusting",
                                 "original_poop_appealing",
                                 "original_poop_eye_catching",
                                 "original_poop_attractive",
                                 "original_poop_avoid_looking"), 
                       ordered = FALSE)

# global fit
res$fit_indices |>
  mutate_if(is.numeric, round_half_up, digits = 2) |>
  kable() |>
  kable_classic(full_width = FALSE)
fit_index value
chisq 1538.21
df 90.00
pvalue 0.00
cfi 0.23
tli 0.22
rmsea 0.18
rmsea.ci.lower 0.17
rmsea.ci.upper 0.19
srmr 0.18
# item diagnostics (loadings, R2, max |std residual|, largest MI, and flags)
res$item_diagnostics |>
  mutate_if(is.numeric, round_half_up, digits = 2) |>
  kable() |>
  kable_classic(full_width = FALSE)
item std_loading R2 flag_loading flag_r2 flag_any
original_poop_like 0.61 0.37 FALSE FALSE FALSE
original_poop_attention_capturing 0.15 0.02 TRUE TRUE TRUE
original_poop_unusual 0.15 0.02 TRUE TRUE TRUE
original_poop_figure_out 0.31 0.10 TRUE TRUE TRUE
original_poop_positive 0.35 0.12 TRUE TRUE TRUE
original_poop_fixtated 0.27 0.07 TRUE TRUE TRUE
original_poop_look_away 0.22 0.05 TRUE TRUE TRUE
original_poop_focused 0.21 0.04 TRUE TRUE TRUE
original_poop_negative 0.17 0.03 TRUE TRUE TRUE
original_poop_disgusting 0.21 0.04 TRUE TRUE TRUE
original_poop_appealing 0.49 0.24 FALSE FALSE FALSE
original_poop_eye_catching 0.17 0.03 TRUE TRUE TRUE
original_poop_attractive 0.66 0.44 FALSE FALSE FALSE
original_poop_avoid_looking 0.29 0.08 TRUE TRUE TRUE
data_exclusions |>
  select(like = original_poop_like,
         attention_capturing = original_poop_attention_capturing,
         unusual = original_poop_unusual,
         figure_out = original_poop_figure_out,
         positive = original_poop_positive,
         fixtated = original_poop_fixtated,
         look_away = original_poop_look_away,
         focused = original_poop_focused,
         negative = original_poop_negative,
         disgusting = original_poop_disgusting,
         appealing = original_poop_appealing,
         eye_catching = original_poop_eye_catching,
         attractive = original_poop_attractive,
         avoid_looking = original_poop_avoid_looking) |>
  cor() |>
  round_half_up(2)
##                      like attention_capturing unusual figure_out positive
## like                 1.00                0.07   -0.09       0.28     0.50
## attention_capturing  0.07                1.00    0.24       0.16     0.13
## unusual             -0.09                0.24    1.00       0.15    -0.13
## figure_out           0.28                0.16    0.15       1.00     0.27
## positive             0.50                0.13   -0.13       0.27     1.00
## fixtated             0.15                0.34    0.20       0.37     0.18
## look_away            0.30               -0.05   -0.09       0.06     0.24
## focused              0.10                0.35    0.16       0.28     0.19
## negative             0.22               -0.06   -0.25       0.03     0.38
## disgusting           0.25               -0.06   -0.16       0.02     0.29
## appealing            0.18                0.00    0.02       0.09     0.16
## eye_catching         0.04                0.60    0.17       0.16     0.13
## attractive           0.20                0.07   -0.02       0.34     0.25
## avoid_looking        0.40               -0.02   -0.09       0.18     0.39
##                     fixtated look_away focused negative disgusting appealing
## like                    0.15      0.30    0.10     0.22       0.25      0.18
## attention_capturing     0.34     -0.05    0.35    -0.06      -0.06      0.00
## unusual                 0.20     -0.09    0.16    -0.25      -0.16      0.02
## figure_out              0.37      0.06    0.28     0.03       0.02      0.09
## positive                0.18      0.24    0.19     0.38       0.29      0.16
## fixtated                1.00      0.07    0.54     0.04       0.03      0.03
## look_away               0.07      1.00    0.08     0.35       0.39      0.07
## focused                 0.54      0.08    1.00     0.06       0.09      0.03
## negative                0.04      0.35    0.06     1.00       0.72      0.12
## disgusting              0.03      0.39    0.09     0.72       1.00      0.13
## appealing               0.03      0.07    0.03     0.12       0.13      1.00
## eye_catching            0.31     -0.01    0.39     0.07       0.02      0.05
## attractive              0.22      0.12    0.15     0.10       0.11      0.18
## avoid_looking           0.14      0.61    0.18     0.46       0.56      0.19
##                     eye_catching attractive avoid_looking
## like                        0.04       0.20          0.40
## attention_capturing         0.60       0.07         -0.02
## unusual                     0.17      -0.02         -0.09
## figure_out                  0.16       0.34          0.18
## positive                    0.13       0.25          0.39
## fixtated                    0.31       0.22          0.14
## look_away                  -0.01       0.12          0.61
## focused                     0.39       0.15          0.18
## negative                    0.07       0.10          0.46
## disgusting                  0.02       0.11          0.56
## appealing                   0.05       0.18          0.19
## eye_catching                1.00       0.10          0.08
## attractive                  0.10       1.00          0.21
## avoid_looking               0.08       0.21          1.00

mod Original

remove negative correlating item - unusual

Chocolate

res <- cfa_constrained(data_exclusions, 
                       items = c(
                         "original_chocolate_like",
                         "original_chocolate_attention_capturing",
                         #"original_chocolate_unusual",
                         "original_chocolate_figure_out",
                         "original_chocolate_positive",
                         "original_chocolate_fixtated",
                         "original_chocolate_look_away",
                         "original_chocolate_focused",
                         "original_chocolate_negative",
                         "original_chocolate_disgusting",
                         "original_chocolate_appealing",
                         "original_chocolate_eye_catching",
                         "original_chocolate_attractive",
                         "original_chocolate_avoid_looking"
                       ), 
                       ordered = FALSE)

# global fit
res$fit_indices |>
  mutate_if(is.numeric, round_half_up, digits = 2) |>
  kable() |>
  kable_classic(full_width = FALSE)
fit_index value
chisq 1800.00
df 77.00
pvalue 0.00
cfi 0.51
tli 0.50
rmsea 0.21
rmsea.ci.lower 0.21
rmsea.ci.upper 0.22
srmr 0.46
# item diagnostics (loadings, R2, max |std residual|, largest MI, and flags)
res$item_diagnostics |>
  mutate_if(is.numeric, round_half_up, digits = 2) |>
  kable() |>
  kable_classic(full_width = FALSE)
item std_loading R2 flag_loading flag_r2 flag_any
original_chocolate_like 0.75 0.56 FALSE FALSE FALSE
original_chocolate_attention_capturing 0.60 0.36 FALSE FALSE FALSE
original_chocolate_figure_out 0.37 0.14 TRUE TRUE TRUE
original_chocolate_positive 0.72 0.52 FALSE FALSE FALSE
original_chocolate_fixtated 0.47 0.22 FALSE FALSE FALSE
original_chocolate_look_away 0.61 0.37 FALSE FALSE FALSE
original_chocolate_focused 0.48 0.24 FALSE FALSE FALSE
original_chocolate_negative 0.72 0.51 FALSE FALSE FALSE
original_chocolate_disgusting 0.71 0.50 FALSE FALSE FALSE
original_chocolate_appealing 0.68 0.46 FALSE FALSE FALSE
original_chocolate_eye_catching 0.63 0.40 FALSE FALSE FALSE
original_chocolate_attractive 0.69 0.47 FALSE FALSE FALSE
original_chocolate_avoid_looking 0.65 0.42 FALSE FALSE FALSE

Poop

res <- cfa_constrained(data_exclusions, 
                       items = c("original_poop_like",
                                 "original_poop_attention_capturing",
                                 #"original_poop_unusual",
                                 "original_poop_figure_out",
                                 "original_poop_positive",
                                 "original_poop_fixtated",
                                 "original_poop_look_away",
                                 "original_poop_focused",
                                 "original_poop_negative",
                                 "original_poop_disgusting",
                                 "original_poop_appealing",
                                 "original_poop_eye_catching",
                                 "original_poop_attractive",
                                 "original_poop_avoid_looking"), 
                       ordered = FALSE)

# global fit
res$fit_indices |>
  mutate_if(is.numeric, round_half_up, digits = 2) |>
  kable() |>
  kable_classic(full_width = FALSE)
fit_index value
chisq 1437.29
df 77.00
pvalue 0.00
cfi 0.24
tli 0.23
rmsea 0.19
rmsea.ci.lower 0.18
rmsea.ci.upper 0.20
srmr 0.19
# item diagnostics (loadings, R2, max |std residual|, largest MI, and flags)
res$item_diagnostics |>
  mutate_if(is.numeric, round_half_up, digits = 2) |>
  kable() |>
  kable_classic(full_width = FALSE)
item std_loading R2 flag_loading flag_r2 flag_any
original_poop_like 0.61 0.38 FALSE FALSE FALSE
original_poop_attention_capturing 0.15 0.02 TRUE TRUE TRUE
original_poop_figure_out 0.31 0.10 TRUE TRUE TRUE
original_poop_positive 0.35 0.13 TRUE TRUE TRUE
original_poop_fixtated 0.27 0.08 TRUE TRUE TRUE
original_poop_look_away 0.22 0.05 TRUE TRUE TRUE
original_poop_focused 0.21 0.05 TRUE TRUE TRUE
original_poop_negative 0.18 0.03 TRUE TRUE TRUE
original_poop_disgusting 0.21 0.04 TRUE TRUE TRUE
original_poop_appealing 0.49 0.24 FALSE FALSE FALSE
original_poop_eye_catching 0.17 0.03 TRUE TRUE TRUE
original_poop_attractive 0.67 0.44 FALSE FALSE FALSE
original_poop_avoid_looking 0.30 0.09 TRUE TRUE TRUE

Classic

Chocolate

res <- cfa_constrained(
  data_exclusions, 
  items = c("classic_chocolate_pos_neg", 
            "classic_chocolate_pleasant_unpleasant", 
            "classic_chocolate_good_bad"), 
  ordered = FALSE
)

# global fit
res$fit_indices |>
  mutate_if(is.numeric, round_half_up, digits = 2) |>
  kable() |>
  kable_classic(full_width = FALSE)
fit_index value
chisq 40.09
df 2.00
pvalue 0.00
cfi 0.96
tli 0.94
rmsea 0.20
rmsea.ci.lower 0.15
rmsea.ci.upper 0.25
srmr 0.09
# item diagnostics (loadings, R2, max |std residual|, largest MI, and flags)
res$item_diagnostics |>
  mutate_if(is.numeric, round_half_up, digits = 2) |>
  kable() |>
  kable_classic(full_width = FALSE)
item std_loading R2 flag_loading flag_r2 flag_any
classic_chocolate_pos_neg 0.89 0.79 FALSE FALSE FALSE
classic_chocolate_pleasant_unpleasant 0.89 0.79 FALSE FALSE FALSE
classic_chocolate_good_bad 0.76 0.58 FALSE FALSE FALSE
data_exclusions |>
  select(pos_neg = classic_chocolate_pos_neg,
         pleasant_unpleasant = classic_chocolate_pleasant_unpleasant,
         good_bad = classic_chocolate_good_bad) |>
  cor() |>
  round_half_up(2)
##                     pos_neg pleasant_unpleasant good_bad
## pos_neg                1.00                0.77     0.75
## pleasant_unpleasant    0.77                1.00     0.68
## good_bad               0.75                0.68     1.00

Poop

res <- cfa_constrained(
  data_exclusions, 
  items = c("classic_poop_pos_neg", 
            "classic_poop_pleasant_unpleasant", 
            "classic_poop_good_bad"), 
  ordered = FALSE
)

# global fit
res$fit_indices |>
  mutate_if(is.numeric, round_half_up, digits = 2) |>
  kable() |>
  kable_classic(full_width = FALSE)
fit_index value
chisq 84.02
df 2.00
pvalue 0.00
cfi 0.84
tli 0.76
rmsea 0.29
rmsea.ci.lower 0.24
rmsea.ci.upper 0.34
srmr 0.11
# item diagnostics (loadings, R2, max |std residual|, largest MI, and flags)
res$item_diagnostics |>
  mutate_if(is.numeric, round_half_up, digits = 2) |>
  kable() |>
  kable_classic(full_width = FALSE)
item std_loading R2 flag_loading flag_r2 flag_any
classic_poop_pos_neg 0.71 0.50 FALSE FALSE FALSE
classic_poop_pleasant_unpleasant 0.89 0.78 FALSE FALSE FALSE
classic_poop_good_bad 0.54 0.29 FALSE FALSE FALSE
data_exclusions |>
  select(pos_neg = classic_poop_pos_neg,
         pleasant_unpleasant = classic_poop_pleasant_unpleasant,
         good_bad = classic_poop_good_bad) |>
  cor() |>
  round_half_up(2)
##                     pos_neg pleasant_unpleasant good_bad
## pos_neg                1.00                0.66     0.62
## pleasant_unpleasant    0.66                1.00     0.47
## good_bad               0.62                0.47     1.00

Reliability (Cronbach’s alpha)

Original items

Chocolate

# data_exclusions |>
#   select(starts_with("original_chocolate_")) |>
#   cor() |>
#   round(2)

reliability_chocolate_original <- data_exclusions |>
  select(starts_with("original_chocolate_")) |>
  alpha()

reliability_chocolate_original$total$raw_alpha
## [1] 0.8791472

Poop

# data_exclusions |>
#   select(starts_with("original_poop_")) |>
#   cor() |>
#   round(2)

reliability_poop_original <- data_exclusions |>
  select(starts_with("original_poop_")) |>
  alpha()
## Some items ( original_poop_unusual ) were negatively correlated with the first principal component and 
## probably should be reversed.  
## To do this, run the function again with the 'check.keys=TRUE' option
reliability_poop_original$total$raw_alpha
## [1] 0.6840143

Classic preference items

Chocolate

# data_exclusions |>
#   select(starts_with("classic_chocolate_")) |>
#   cor() |>
#   round(2)

reliability_chocolate_classic <- data_exclusions |>
  select(starts_with("classic_chocolate_")) |>
  alpha()

reliability_chocolate_classic$total$raw_alpha
## [1] 0.8840627

Poop

# data_exclusions |>
#   select(starts_with("classic_poop_")) |>
#   cor() |>
#   round(2)

reliability_poop_classic <- data_exclusions |>
  select(starts_with("classic_poop_")) |>
  alpha()

reliability_poop_classic$total$raw_alpha
## [1] 0.7767675

Convergent validity

Chocolate

data_exclusions |>
  select(desirability_chocolate,
         classic_chocolate,
         original_chocolate) |>
  cor() |>
  round_half_up(2) 
##                        desirability_chocolate classic_chocolate
## desirability_chocolate                   1.00              0.58
## classic_chocolate                        0.58              1.00
## original_chocolate                       0.49              0.70
##                        original_chocolate
## desirability_chocolate               0.49
## classic_chocolate                    0.70
## original_chocolate                   1.00
ggplot(data_exclusions, aes(desirability_chocolate, classic_chocolate)) +
  geom_jitter(width = 0.1, height = 0.1, alpha = 0.3) +
  scale_x_continuous(limits = c(0.5, 7.5), breaks = 1:7) +
  scale_y_continuous(limits = c(0.5, 7.5), breaks = 1:7)

ggplot(data_exclusions, aes(desirability_chocolate, original_chocolate)) +
  geom_jitter(width = 0.1, height = 0.1, alpha = 0.3) +
  scale_x_continuous(limits = c(0.5, 7.5), breaks = 1:7) +
  scale_y_continuous(limits = c(0.5, 7.5), breaks = 1:7)

Poop

data_exclusions |>
  select(desirability_poop,
         classic_poop,
         original_poop) |>
  cor() |>
  round_half_up(2) 
##                   desirability_poop classic_poop original_poop
## desirability_poop              1.00         0.42          0.33
## classic_poop                   0.42         1.00          0.37
## original_poop                  0.33         0.37          1.00
ggplot(data_exclusions, aes(desirability_poop, classic_poop)) +
  geom_jitter(width = 0.1, height = 0.1, alpha = 0.3) +
  scale_x_continuous(limits = c(0.5, 7.5), breaks = 1:7) +
  scale_y_continuous(limits = c(0.5, 7.5), breaks = 1:7)

ggplot(data_exclusions, aes(desirability_poop, original_poop)) +
  geom_jitter(width = 0.1, height = 0.1, alpha = 0.3) +
  scale_x_continuous(limits = c(0.5, 7.5), breaks = 1:7) +
  scale_y_continuous(limits = c(0.5, 7.5), breaks = 1:7)

Standardized mean differences

cohens_d_and_summaries <- function(data, var1, var2, mu = 4){
  data |>
    rename(var1 = {{var1}},
           var2 = {{var2}}) |>
    summarize(m1 = mean(var1),
              sd1 = sd(var1),
              n1 = n(), # assumes complete data
              m2 = mean(var2),
              sd2 = sd(var2),
              n2 = n(), # assumes complete data
              r = cor(var1, var2),
              d_s_onesample1 = cohens_d(var1, mu = mu)$Cohens_d,
              d_s_onesample2 = cohens_d(var2, mu = mu)$Cohens_d,
              d_av = repeated_measures_d(x = var1, 
                                         y = var2, 
                                         method = "av"),
              d_rm = repeated_measures_d(x = var1, 
                                         y = var2, 
                                         method = "rm"),
              d_z = repeated_measures_d(x = var1, 
                                         y = var2, 
                                         method = "z"),
              d_s = cohens_d(x = var1, 
                             y = var2)) |>
    unnest(d_av) |>
    select(-CI) |>
    rename(d_av__estimate = d_av,
           d_av__ci_lower = CI_low,
           d_av__ci_upper = CI_high) |>
    unnest(d_rm) |>
    select(-CI) |>
    rename(d_rm__estimate = d_rm,
           d_rm__ci_lower = CI_low,
           d_rm__ci_upper = CI_high) |>
    unnest(d_z) |>
    select(-CI) |>
    rename(d_z__estimate = d_z,
           d_z__ci_lower = CI_low,
           d_z__ci_upper = CI_high) |>
    unnest(d_s) |>
    select(-CI) |>
    rename(d_s__estimate = Cohens_d,
           d_s__ci_lower = CI_low,
           d_s__ci_upper = CI_high) |>
    mutate(var1 = rlang::as_name(ensym(var1)),
           var2 = rlang::as_name(ensym(var2))) |>
    relocate(var2) |>
    relocate(var1)
}

res <- bind_rows(
  cohens_d_and_summaries(data = data_exclusions, var1 = original_chocolate, var2 = original_poop),
  cohens_d_and_summaries(data = data_exclusions, var1 = classic_chocolate, var2 = classic_poop),
  cohens_d_and_summaries(data = data_exclusions, var1 = classic_chocolate_pos_neg, var2 = classic_poop_pos_neg),
  cohens_d_and_summaries(data = data_exclusions, var1 = classic_chocolate_pleasant_unpleasant, var2 = classic_poop_pleasant_unpleasant),
  cohens_d_and_summaries(data = data_exclusions, var1 = classic_chocolate_good_bad, var2 = classic_poop_good_bad),
  cohens_d_and_summaries(data = data_exclusions, var1 = desirability_chocolate, var2 = desirability_poop),
  cohens_d_and_summaries(data = data_exclusions, var1 = love, var2 = murder),
  cohens_d_and_summaries(data = data_exclusions, var1 = honest, var2 = dishonest),
  cohens_d_and_summaries(data = data_exclusions, var1 = vacation, var2 = racist),
  cohens_d_and_summaries(data = data_exclusions, var1 = liberals, var2 = conservatives),
  cohens_d_and_summaries(data = data_exclusions, var1 = mcdonalds, var2 = burgerking),
  cohens_d_and_summaries(data = data_exclusions, var1 = girls_skirts, var2 = boys_skirts),
  cohens_d_and_summaries(data = data_exclusions, var1 = cats_legs, var2 = fish_legs),
  cohens_d_and_summaries(data = data_exclusions, var1 = original_chocolate_like, var2 = original_poop_like),
  cohens_d_and_summaries(data = data_exclusions, var1 = original_chocolate_attention_capturing, var2 = original_poop_attention_capturing),
  cohens_d_and_summaries(data = data_exclusions, var1 = original_chocolate_unusual, var2 = original_poop_unusual),
  cohens_d_and_summaries(data = data_exclusions, var1 = original_chocolate_figure_out, var2 = original_poop_figure_out),
  cohens_d_and_summaries(data = data_exclusions, var1 = original_chocolate_positive, var2 = original_poop_positive),
  cohens_d_and_summaries(data = data_exclusions, var1 = original_chocolate_fixtated, var2 = original_poop_fixtated),
  cohens_d_and_summaries(data = data_exclusions, var1 = original_chocolate_look_away, var2 = original_poop_look_away),
  cohens_d_and_summaries(data = data_exclusions, var1 = original_chocolate_focused, var2 = original_poop_focused),
  cohens_d_and_summaries(data = data_exclusions, var1 = original_chocolate_negative, var2 = original_poop_negative),
  cohens_d_and_summaries(data = data_exclusions, var1 = original_chocolate_disgusting, var2 = original_poop_disgusting),
  cohens_d_and_summaries(data = data_exclusions, var1 = original_chocolate_appealing, var2 = original_poop_appealing),
  cohens_d_and_summaries(data = data_exclusions, var1 = original_chocolate_eye_catching, var2 = original_poop_eye_catching),
  cohens_d_and_summaries(data = data_exclusions, var1 = original_chocolate_attractive, var2 = original_poop_attractive),
  cohens_d_and_summaries(data = data_exclusions, var1 = original_chocolate_avoid_looking, var2 = original_poop_avoid_looking),
)

res |>
  mutate_if(is.numeric, round_half_up, digits = 2)
## # A tibble: 27 × 23
##    var1           var2     m1   sd1    n1    m2   sd2    n2     r d_s_onesample1
##    <chr>          <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>          <dbl>
##  1 original_choc… orig…  5.52  0.76   489  1.99  0.65   489 -0.21           1.99
##  2 classic_choco… clas…  6.44  0.77   489  1.76  0.9    489 -0.23           3.18
##  3 classic_choco… clas…  6.41  0.82   489  1.67  1.06   489 -0.2            2.95
##  4 classic_choco… clas…  6.6   0.73   489  1.34  0.75   489 -0.23           3.54
##  5 classic_choco… clas…  6.32  0.99   489  2.27  1.36   489 -0.23           2.35
##  6 desirability_… desi…  6.4   1.01   489  1.19  0.63   489 -0.04           2.37
##  7 love           murd…  6.74  0.54   489  1.1   0.42   489 -0.09           5.07
##  8 honest         dish…  6.54  0.72   489  1.51  0.74   489 -0.5            3.55
##  9 vacation       raci…  6.53  0.77   489  1.25  0.68   489 -0.13           3.29
## 10 liberals       cons…  4.1   1.57   489  3.01  1.65   489 -0.25           0.07
## # ℹ 17 more rows
## # ℹ 13 more variables: d_s_onesample2 <dbl>, d_av__estimate <dbl>,
## #   d_av__ci_lower <dbl>, d_av__ci_upper <dbl>, d_rm__estimate <dbl>,
## #   d_rm__ci_lower <dbl>, d_rm__ci_upper <dbl>, d_z__estimate <dbl>,
## #   d_z__ci_lower <dbl>, d_z__ci_upper <dbl>, d_s__estimate <dbl>,
## #   d_s__ci_lower <dbl>, d_s__ci_upper <dbl>
res_long <- res |>
  select(var1, var2, starts_with("d_") & !contains("sample")) |>
  pivot_longer(cols = starts_with("d_"),
               names_to = c("type", "parameter"),
               names_sep = "__",
               values_to = "value") |>
  pivot_wider(names_from = parameter,
              values_from = value) |>
  mutate(comparison = paste(var1, var2)) |>
  mutate(comparison = case_when(comparison == "original_chocolate original_poop" ~ "chocolate-poop original",
                                comparison == "classic_chocolate classic_poop" ~ "chocolate-poop classic",
                                comparison == "classic_chocolate_pos_neg classic_poop_pos_neg" ~ "chocolate-poop pos-neg",
                                comparison == "classic_chocolate_pleasant_unpleasant classic_poop_pleasant_unpleasant" ~ "chocolate-poop pleasant-unpleasant",
                                comparison == "classic_chocolate_good_bad classic_poop_good_bad" ~ "chocolate-poop good-bad",
                                comparison == "desirability_chocolate desirability_poop" ~ "chocolate-poop desirability",
                                comparison == "cats_legs fish_legs" ~ "cats/fish have four legs",
                                comparison == "girls_skirts boys_skirts" ~ "girls/boys tend to wear skirts",
                                TRUE ~ comparison)) |>
    mutate(comparison = fct_reorder(comparison, estimate)) 

res_long
## # A tibble: 108 × 7
##    var1                      var2    type  estimate ci_lower ci_upper comparison
##    <chr>                     <chr>   <chr>    <dbl>    <dbl>    <dbl> <fct>     
##  1 original_chocolate        origin… d_av      4.97     4.83     5.11 chocolate…
##  2 original_chocolate        origin… d_rm      4.98     4.47     5.48 chocolate…
##  3 original_chocolate        origin… d_z       3.20     2.98     3.42 chocolate…
##  4 original_chocolate        origin… d_s       4.98     4.72     5.23 chocolate…
##  5 classic_chocolate         classi… d_av      5.57     5.43     5.71 chocolate…
##  6 classic_chocolate         classi… d_rm      5.58     5.01     6.15 chocolate…
##  7 classic_chocolate         classi… d_z       3.56     3.32     3.80 chocolate…
##  8 classic_chocolate         classi… d_s       5.58     5.30     5.86 chocolate…
##  9 classic_chocolate_pos_neg classi… d_av      5.00     4.86     5.14 chocolate…
## 10 classic_chocolate_pos_neg classi… d_rm      5.01     4.51     5.52 chocolate…
## # ℹ 98 more rows
ggplot(res_long, aes(estimate, comparison, color = type)) +
  geom_linerangeh(aes(xmin = ci_lower, xmax = ci_upper), 
                  position = position_dodge(width = 0.8)) +
  geom_point(position = position_dodge(width = 0.8)) +
  scale_x_continuous(name = "Cohen's d", breaks = breaks_pretty(n = 6)) +
  ylab("") +
  theme_linedraw() +
  guides(color = guide_legend(reverse = TRUE)) 

res_long_subset <- res_long |> 
  filter(comparison %in% c("love murder", 
                           "honest dishonest",
                           "chocolate-poop original",
                           "chocolate-poop classic",
                           "chocolate-poop pos-neg",
                           "chocolate-poop pleasant-unpleasant",
                           "chocolate-poop good-bad",
                           "cats/fish have four legs",
                           "girls/boys tend to wear skirts",
                           "chocolate-poop desirability")) |>
  filter(type == "d_av") 

res_long_subset |>
  mutate_if(is.numeric, round_half_up, digits = 2)
## # A tibble: 10 × 7
##    var1                        var2  type  estimate ci_lower ci_upper comparison
##    <chr>                       <chr> <chr>    <dbl>    <dbl>    <dbl> <fct>     
##  1 original_chocolate          orig… d_av      4.97     4.83     5.11 chocolate…
##  2 classic_chocolate           clas… d_av      5.57     5.43     5.71 chocolate…
##  3 classic_chocolate_pos_neg   clas… d_av      5        4.86     5.14 chocolate…
##  4 classic_chocolate_pleasant… clas… d_av      7.07     6.93     7.21 chocolate…
##  5 classic_chocolate_good_bad  clas… d_av      3.4      3.26     3.54 chocolate…
##  6 desirability_chocolate      desi… d_av      6.15     6.02     6.28 chocolate…
##  7 love                        murd… d_av     11.6     11.5     11.8  love murd…
##  8 honest                      dish… d_av      6.92     6.77     7.08 honest di…
##  9 girls_skirts                boys… d_av      2.64     2.51     2.78 girls/boy…
## 10 cats_legs                   fish… d_av     11.6     11.4     11.7  cats/fish…
res_long_subset |>
  ggplot(aes(estimate, comparison)) +
  geom_linerangeh(aes(xmin = ci_lower, xmax = ci_upper)) +
  geom_point() +
  scale_x_continuous(name = "Cohen's d", breaks = breaks_pretty(n = 6)) +
  ylab("") +
  theme_linedraw() 

res_long_subset_chocpoop <- res_long |> 
  filter(comparison %in% c("chocolate-poop original",
                           "chocolate-poop classic",
                           "chocolate-poop pos-neg",
                           "chocolate-poop pleasant-unpleasant",
                           "chocolate-poop good-bad",
                           "chocolate-poop desirability"))

ggplot(res_long_subset_chocpoop, aes(estimate, comparison, color = type)) +
  geom_linerangeh(aes(xmin = ci_lower, xmax = ci_upper), position = position_dodge(width = 0.7)) +
  geom_point(position = position_dodge(width = 0.7)) +
  scale_x_continuous(name = "Cohen's d", breaks = breaks_pretty(n = 6)) +
  ylab("Outcome") +
  theme_linedraw() +
  guides(color = guide_legend(reverse = TRUE)) 

res_long_subset_chocpoop2 <- res_long |> 
  filter(comparison %in% c(
    "chocolate-poop original",
    "chocolate-poop classic",
    "chocolate-poop pos-neg",
    "chocolate-poop pleasant-unpleasant",
    "chocolate-poop good-bad",
    "chocolate-poop desirability",
    "original_chocolate_like original_poop_like",
    #"original_chocolate_attention_capturing original_poop_attention_capturing",
    #"original_chocolate_unusual original_poop_unusual",
    #"original_chocolate_figure_out original_poop_figure_out",
    "original_chocolate_positive original_poop_positive",
    #"original_chocolate_fixtated original_poop_fixtated",
    "original_chocolate_look_away original_poop_look_away",
    #"original_chocolate_focused original_poop_focused",
    "original_chocolate_negative original_poop_negative",
    "original_chocolate_disgusting original_poop_disgusting",
    #"original_chocolate_appealing original_poop_appealing",
    #"original_chocolate_eye_catching original_poop_eye_catching",
    #"original_chocolate_attractive original_poop_attractive",
    "original_chocolate_avoid_looking original_poop_avoid_looking"
  )) |>
  filter(type == "d_av")

ggplot(res_long_subset_chocpoop2, aes(estimate, comparison)) +
  geom_linerangeh(aes(xmin = ci_lower, xmax = ci_upper), position = position_dodge(width = 0.7)) +
  geom_point(position = position_dodge(width = 0.7)) +
  scale_x_continuous(name = "Cohen's d", breaks = breaks_pretty(n = 6)) +
  ylab("Outcome") +
  theme_linedraw() +
  guides(color = guide_legend(reverse = TRUE)) 

Predicted vs observed

Researchers’ predictions about the Cohen’s d_av between the single item desirability items.

data_predictions |>
  arrange(predicted_d) |>
  kable() |>
  kable_classic(full_width = FALSE)
person predicted_d
Robert Miller 3.000000
Laura 3.400000
Matt WIlliams 3.600000
Julian 3.900000
Brendan Schuetze 4.000000
Karsten Konrad 4.000000
Annika 4.200000
Malte 4.500000
Sanjay 4.520000
Beth 4.600000
Lukas 4.700000
Ruben 4.870000
Martin Plöderl 4.913785
Alex 5.000000
Jamie 5.200000
ian 5.500000
Sandra 5.800000
Sab 6.000000
Hilmar 6.000000
Aaron 6.200000
Eiko 8.000000
data_predictions |>
  count()
## # A tibble: 1 × 1
##       n
##   <int>
## 1    21
ggplot(data_predictions, aes(predicted_d)) +
  geom_histogram(boundary = 0.5, binwidth = 1) +
  scale_x_continuous(breaks = 1:9, name = "Predicted Cohen's d_av") +
  ylab("Frequency") +
  geom_vline(xintercept = res$d_rm, linetype = "dashed", color = "red") +
  theme_linedraw()

IRT

library(mirt)
library(psych)

data_irt_choc <- data_exclusions %>% 
  select(contains("chocolate"), -classic_chocolate, -original_chocolate)

mod_1f <- mirt(data_irt_choc, 1, itemtype = "graded", SE = TRUE, verbose = FALSE)

summary(mod_1f) # includes item parameters on logit scale and factor variance
##                                             F1      h2
## desirability_chocolate                  0.8406 0.70665
## classic_chocolate_pos_neg               0.8926 0.79672
## classic_chocolate_pleasant_unpleasant   0.8981 0.80665
## classic_chocolate_good_bad              0.8494 0.72141
## original_chocolate_like                 0.9088 0.82591
## original_chocolate_attention_capturing  0.7975 0.63606
## original_chocolate_unusual             -0.0757 0.00573
## original_chocolate_figure_out           0.5591 0.31260
## original_chocolate_positive             0.8992 0.80862
## original_chocolate_fixtated             0.7685 0.59055
## original_chocolate_look_away            0.6443 0.41513
## original_chocolate_focused              0.7554 0.57064
## original_chocolate_negative             0.6966 0.48521
## original_chocolate_disgusting           0.6346 0.40268
## original_chocolate_appealing            0.8903 0.79258
## original_chocolate_eye_catching         0.8262 0.68255
## original_chocolate_attractive           0.8518 0.72561
## original_chocolate_avoid_looking        0.6961 0.48453
## 
##                                        SE.F1
## desirability_chocolate                 0.022
## classic_chocolate_pos_neg              0.016
## classic_chocolate_pleasant_unpleasant  0.017
## classic_chocolate_good_bad             0.020
## original_chocolate_like                0.014
## original_chocolate_attention_capturing 0.022
## original_chocolate_unusual             0.054
## original_chocolate_figure_out          0.036
## original_chocolate_positive            0.013
## original_chocolate_fixtated            0.023
## original_chocolate_look_away           0.043
## original_chocolate_focused             0.024
## original_chocolate_negative            0.042
## original_chocolate_disgusting          0.065
## original_chocolate_appealing           0.015
## original_chocolate_eye_catching        0.020
## original_chocolate_attractive          0.018
## original_chocolate_avoid_looking       0.043
## 
## SS loadings:  10.77 
## Proportion Var:  0.598 
## 
## Factor correlations: 
## 
##    F1
## F1  1
# irt_coefs <- coef(mod_1f, IRTpars = TRUE, simplify = TRUE)
# irt_coefs
# 
# fs <- fscores(mod_1f, method = "EAP", full.scores.SE = TRUE)
# head(fs)
# # fs is matrix with theta and SEs in columns named "F1" and "SE.F1"
# theta <- fs[, "F1"]
# theta_se <- fs[, "SE.F1"]

# --- Plots
# Trace lines (category response curves) for all items
plot(mod_1f, type = "trace", facet_items = TRUE)

# Item information functions
plot(mod_1f, type = "infotrace", facet_items = TRUE)

# Test information function
plot(mod_1f, type = "info")

# --- Check for local dependence (Q3)
ld <- residuals(mod_1f, type = "Q3")
## Q3 summary statistics:
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  -0.321  -0.129  -0.069  -0.035   0.051   0.433 
## 
##                                        desirability_chocolate
## desirability_chocolate                                  1.000
## classic_chocolate_pos_neg                               0.036
## classic_chocolate_pleasant_unpleasant                   0.121
## classic_chocolate_good_bad                              0.037
## original_chocolate_like                                 0.023
## original_chocolate_attention_capturing                 -0.170
## original_chocolate_unusual                              0.051
## original_chocolate_figure_out                          -0.183
## original_chocolate_positive                            -0.107
## original_chocolate_fixtated                            -0.069
## original_chocolate_look_away                           -0.103
## original_chocolate_focused                             -0.124
## original_chocolate_negative                            -0.110
## original_chocolate_disgusting                          -0.065
## original_chocolate_appealing                            0.103
## original_chocolate_eye_catching                        -0.154
## original_chocolate_attractive                          -0.134
## original_chocolate_avoid_looking                       -0.064
##                                        classic_chocolate_pos_neg
## desirability_chocolate                                     0.036
## classic_chocolate_pos_neg                                  1.000
## classic_chocolate_pleasant_unpleasant                      0.350
## classic_chocolate_good_bad                                 0.368
## original_chocolate_like                                   -0.132
## original_chocolate_attention_capturing                    -0.237
## original_chocolate_unusual                                -0.009
## original_chocolate_figure_out                             -0.092
## original_chocolate_positive                               -0.072
## original_chocolate_fixtated                               -0.183
## original_chocolate_look_away                              -0.089
## original_chocolate_focused                                -0.111
## original_chocolate_negative                                0.069
## original_chocolate_disgusting                             -0.165
## original_chocolate_appealing                              -0.265
## original_chocolate_eye_catching                           -0.230
## original_chocolate_attractive                             -0.299
## original_chocolate_avoid_looking                          -0.076
##                                        classic_chocolate_pleasant_unpleasant
## desirability_chocolate                                                 0.121
## classic_chocolate_pos_neg                                              0.350
## classic_chocolate_pleasant_unpleasant                                  1.000
## classic_chocolate_good_bad                                             0.205
## original_chocolate_like                                               -0.059
## original_chocolate_attention_capturing                                -0.243
## original_chocolate_unusual                                             0.065
## original_chocolate_figure_out                                         -0.109
## original_chocolate_positive                                           -0.170
## original_chocolate_fixtated                                           -0.212
## original_chocolate_look_away                                          -0.006
## original_chocolate_focused                                            -0.189
## original_chocolate_negative                                            0.020
## original_chocolate_disgusting                                         -0.042
## original_chocolate_appealing                                          -0.129
## original_chocolate_eye_catching                                       -0.287
## original_chocolate_attractive                                         -0.321
## original_chocolate_avoid_looking                                      -0.025
##                                        classic_chocolate_good_bad
## desirability_chocolate                                      0.037
## classic_chocolate_pos_neg                                   0.368
## classic_chocolate_pleasant_unpleasant                       0.205
## classic_chocolate_good_bad                                  1.000
## original_chocolate_like                                    -0.112
## original_chocolate_attention_capturing                     -0.320
## original_chocolate_unusual                                 -0.004
## original_chocolate_figure_out                              -0.137
## original_chocolate_positive                                 0.026
## original_chocolate_fixtated                                -0.190
## original_chocolate_look_away                               -0.060
## original_chocolate_focused                                 -0.096
## original_chocolate_negative                                 0.236
## original_chocolate_disgusting                              -0.098
## original_chocolate_appealing                               -0.195
## original_chocolate_eye_catching                            -0.301
## original_chocolate_attractive                              -0.264
## original_chocolate_avoid_looking                           -0.038
##                                        original_chocolate_like
## desirability_chocolate                                   0.023
## classic_chocolate_pos_neg                               -0.132
## classic_chocolate_pleasant_unpleasant                   -0.059
## classic_chocolate_good_bad                              -0.112
## original_chocolate_like                                  1.000
## original_chocolate_attention_capturing                  -0.129
## original_chocolate_unusual                              -0.070
## original_chocolate_figure_out                           -0.161
## original_chocolate_positive                             -0.069
## original_chocolate_fixtated                             -0.187
## original_chocolate_look_away                            -0.010
## original_chocolate_focused                              -0.211
## original_chocolate_negative                              0.016
## original_chocolate_disgusting                            0.073
## original_chocolate_appealing                             0.081
## original_chocolate_eye_catching                         -0.256
## original_chocolate_attractive                           -0.256
## original_chocolate_avoid_looking                        -0.045
##                                        original_chocolate_attention_capturing
## desirability_chocolate                                                 -0.170
## classic_chocolate_pos_neg                                              -0.237
## classic_chocolate_pleasant_unpleasant                                  -0.243
## classic_chocolate_good_bad                                             -0.320
## original_chocolate_like                                                -0.129
## original_chocolate_attention_capturing                                  1.000
## original_chocolate_unusual                                              0.085
## original_chocolate_figure_out                                           0.159
## original_chocolate_positive                                            -0.122
## original_chocolate_fixtated                                             0.119
## original_chocolate_look_away                                           -0.064
## original_chocolate_focused                                              0.055
## original_chocolate_negative                                            -0.121
## original_chocolate_disgusting                                          -0.075
## original_chocolate_appealing                                           -0.113
## original_chocolate_eye_catching                                         0.355
## original_chocolate_attractive                                           0.045
## original_chocolate_avoid_looking                                       -0.110
##                                        original_chocolate_unusual
## desirability_chocolate                                      0.051
## classic_chocolate_pos_neg                                  -0.009
## classic_chocolate_pleasant_unpleasant                       0.065
## classic_chocolate_good_bad                                 -0.004
## original_chocolate_like                                    -0.070
## original_chocolate_attention_capturing                      0.085
## original_chocolate_unusual                                  1.000
## original_chocolate_figure_out                               0.211
## original_chocolate_positive                                -0.057
## original_chocolate_fixtated                                 0.264
## original_chocolate_look_away                               -0.167
## original_chocolate_focused                                  0.163
## original_chocolate_negative                                -0.133
## original_chocolate_disgusting                              -0.128
## original_chocolate_appealing                               -0.041
## original_chocolate_eye_catching                             0.051
## original_chocolate_attractive                              -0.043
## original_chocolate_avoid_looking                           -0.123
##                                        original_chocolate_figure_out
## desirability_chocolate                                        -0.183
## classic_chocolate_pos_neg                                     -0.092
## classic_chocolate_pleasant_unpleasant                         -0.109
## classic_chocolate_good_bad                                    -0.137
## original_chocolate_like                                       -0.161
## original_chocolate_attention_capturing                         0.159
## original_chocolate_unusual                                     0.211
## original_chocolate_figure_out                                  1.000
## original_chocolate_positive                                    0.021
## original_chocolate_fixtated                                    0.292
## original_chocolate_look_away                                  -0.119
## original_chocolate_focused                                     0.256
## original_chocolate_negative                                   -0.106
## original_chocolate_disgusting                                 -0.096
## original_chocolate_appealing                                  -0.069
## original_chocolate_eye_catching                                0.121
## original_chocolate_attractive                                 -0.001
## original_chocolate_avoid_looking                              -0.086
##                                        original_chocolate_positive
## desirability_chocolate                                      -0.107
## classic_chocolate_pos_neg                                   -0.072
## classic_chocolate_pleasant_unpleasant                       -0.170
## classic_chocolate_good_bad                                   0.026
## original_chocolate_like                                     -0.069
## original_chocolate_attention_capturing                      -0.122
## original_chocolate_unusual                                  -0.057
## original_chocolate_figure_out                                0.021
## original_chocolate_positive                                  1.000
## original_chocolate_fixtated                                 -0.050
## original_chocolate_look_away                                -0.049
## original_chocolate_focused                                  -0.058
## original_chocolate_negative                                  0.142
## original_chocolate_disgusting                               -0.009
## original_chocolate_appealing                                -0.093
## original_chocolate_eye_catching                             -0.224
## original_chocolate_attractive                               -0.073
## original_chocolate_avoid_looking                            -0.056
##                                        original_chocolate_fixtated
## desirability_chocolate                                      -0.069
## classic_chocolate_pos_neg                                   -0.183
## classic_chocolate_pleasant_unpleasant                       -0.212
## classic_chocolate_good_bad                                  -0.190
## original_chocolate_like                                     -0.187
## original_chocolate_attention_capturing                       0.119
## original_chocolate_unusual                                   0.264
## original_chocolate_figure_out                                0.292
## original_chocolate_positive                                 -0.050
## original_chocolate_fixtated                                  1.000
## original_chocolate_look_away                                -0.141
## original_chocolate_focused                                   0.433
## original_chocolate_negative                                 -0.212
## original_chocolate_disgusting                               -0.115
## original_chocolate_appealing                                -0.119
## original_chocolate_eye_catching                              0.131
## original_chocolate_attractive                                0.007
## original_chocolate_avoid_looking                            -0.138
##                                        original_chocolate_look_away
## desirability_chocolate                                       -0.103
## classic_chocolate_pos_neg                                    -0.089
## classic_chocolate_pleasant_unpleasant                        -0.006
## classic_chocolate_good_bad                                   -0.060
## original_chocolate_like                                      -0.010
## original_chocolate_attention_capturing                       -0.064
## original_chocolate_unusual                                   -0.167
## original_chocolate_figure_out                                -0.119
## original_chocolate_positive                                  -0.049
## original_chocolate_fixtated                                  -0.141
## original_chocolate_look_away                                  1.000
## original_chocolate_focused                                   -0.099
## original_chocolate_negative                                   0.174
## original_chocolate_disgusting                                 0.125
## original_chocolate_appealing                                 -0.012
## original_chocolate_eye_catching                              -0.078
## original_chocolate_attractive                                 0.074
## original_chocolate_avoid_looking                              0.363
##                                        original_chocolate_focused
## desirability_chocolate                                     -0.124
## classic_chocolate_pos_neg                                  -0.111
## classic_chocolate_pleasant_unpleasant                      -0.189
## classic_chocolate_good_bad                                 -0.096
## original_chocolate_like                                    -0.211
## original_chocolate_attention_capturing                      0.055
## original_chocolate_unusual                                  0.163
## original_chocolate_figure_out                               0.256
## original_chocolate_positive                                -0.058
## original_chocolate_fixtated                                 0.433
## original_chocolate_look_away                               -0.099
## original_chocolate_focused                                  1.000
## original_chocolate_negative                                -0.107
## original_chocolate_disgusting                              -0.055
## original_chocolate_appealing                               -0.162
## original_chocolate_eye_catching                             0.057
## original_chocolate_attractive                               0.019
## original_chocolate_avoid_looking                           -0.118
##                                        original_chocolate_negative
## desirability_chocolate                                      -0.110
## classic_chocolate_pos_neg                                    0.069
## classic_chocolate_pleasant_unpleasant                        0.020
## classic_chocolate_good_bad                                   0.236
## original_chocolate_like                                      0.016
## original_chocolate_attention_capturing                      -0.121
## original_chocolate_unusual                                  -0.133
## original_chocolate_figure_out                               -0.106
## original_chocolate_positive                                  0.142
## original_chocolate_fixtated                                 -0.212
## original_chocolate_look_away                                 0.174
## original_chocolate_focused                                  -0.107
## original_chocolate_negative                                  1.000
## original_chocolate_disgusting                                0.309
## original_chocolate_appealing                                -0.160
## original_chocolate_eye_catching                             -0.235
## original_chocolate_attractive                               -0.171
## original_chocolate_avoid_looking                             0.269
##                                        original_chocolate_disgusting
## desirability_chocolate                                        -0.065
## classic_chocolate_pos_neg                                     -0.165
## classic_chocolate_pleasant_unpleasant                         -0.042
## classic_chocolate_good_bad                                    -0.098
## original_chocolate_like                                        0.073
## original_chocolate_attention_capturing                        -0.075
## original_chocolate_unusual                                    -0.128
## original_chocolate_figure_out                                 -0.096
## original_chocolate_positive                                   -0.009
## original_chocolate_fixtated                                   -0.115
## original_chocolate_look_away                                   0.125
## original_chocolate_focused                                    -0.055
## original_chocolate_negative                                    0.309
## original_chocolate_disgusting                                  1.000
## original_chocolate_appealing                                   0.111
## original_chocolate_eye_catching                               -0.109
## original_chocolate_attractive                                  0.016
## original_chocolate_avoid_looking                               0.195
##                                        original_chocolate_appealing
## desirability_chocolate                                        0.103
## classic_chocolate_pos_neg                                    -0.265
## classic_chocolate_pleasant_unpleasant                        -0.129
## classic_chocolate_good_bad                                   -0.195
## original_chocolate_like                                       0.081
## original_chocolate_attention_capturing                       -0.113
## original_chocolate_unusual                                   -0.041
## original_chocolate_figure_out                                -0.069
## original_chocolate_positive                                  -0.093
## original_chocolate_fixtated                                  -0.119
## original_chocolate_look_away                                 -0.012
## original_chocolate_focused                                   -0.162
## original_chocolate_negative                                  -0.160
## original_chocolate_disgusting                                 0.111
## original_chocolate_appealing                                  1.000
## original_chocolate_eye_catching                               0.065
## original_chocolate_attractive                                 0.221
## original_chocolate_avoid_looking                              0.038
##                                        original_chocolate_eye_catching
## desirability_chocolate                                          -0.154
## classic_chocolate_pos_neg                                       -0.230
## classic_chocolate_pleasant_unpleasant                           -0.287
## classic_chocolate_good_bad                                      -0.301
## original_chocolate_like                                         -0.256
## original_chocolate_attention_capturing                           0.355
## original_chocolate_unusual                                       0.051
## original_chocolate_figure_out                                    0.121
## original_chocolate_positive                                     -0.224
## original_chocolate_fixtated                                      0.131
## original_chocolate_look_away                                    -0.078
## original_chocolate_focused                                       0.057
## original_chocolate_negative                                     -0.235
## original_chocolate_disgusting                                   -0.109
## original_chocolate_appealing                                     0.065
## original_chocolate_eye_catching                                  1.000
## original_chocolate_attractive                                    0.421
## original_chocolate_avoid_looking                                -0.062
##                                        original_chocolate_attractive
## desirability_chocolate                                        -0.134
## classic_chocolate_pos_neg                                     -0.299
## classic_chocolate_pleasant_unpleasant                         -0.321
## classic_chocolate_good_bad                                    -0.264
## original_chocolate_like                                       -0.256
## original_chocolate_attention_capturing                         0.045
## original_chocolate_unusual                                    -0.043
## original_chocolate_figure_out                                 -0.001
## original_chocolate_positive                                   -0.073
## original_chocolate_fixtated                                    0.007
## original_chocolate_look_away                                   0.074
## original_chocolate_focused                                     0.019
## original_chocolate_negative                                   -0.171
## original_chocolate_disgusting                                  0.016
## original_chocolate_appealing                                   0.221
## original_chocolate_eye_catching                                0.421
## original_chocolate_attractive                                  1.000
## original_chocolate_avoid_looking                               0.058
##                                        original_chocolate_avoid_looking
## desirability_chocolate                                           -0.064
## classic_chocolate_pos_neg                                        -0.076
## classic_chocolate_pleasant_unpleasant                            -0.025
## classic_chocolate_good_bad                                       -0.038
## original_chocolate_like                                          -0.045
## original_chocolate_attention_capturing                           -0.110
## original_chocolate_unusual                                       -0.123
## original_chocolate_figure_out                                    -0.086
## original_chocolate_positive                                      -0.056
## original_chocolate_fixtated                                      -0.138
## original_chocolate_look_away                                      0.363
## original_chocolate_focused                                       -0.118
## original_chocolate_negative                                       0.269
## original_chocolate_disgusting                                     0.195
## original_chocolate_appealing                                      0.038
## original_chocolate_eye_catching                                  -0.062
## original_chocolate_attractive                                     0.058
## original_chocolate_avoid_looking                                  1.000
print(ld)
##                                        desirability_chocolate
## desirability_chocolate                                  1.000
## classic_chocolate_pos_neg                               0.036
## classic_chocolate_pleasant_unpleasant                   0.121
## classic_chocolate_good_bad                              0.037
## original_chocolate_like                                 0.023
## original_chocolate_attention_capturing                 -0.170
## original_chocolate_unusual                              0.051
## original_chocolate_figure_out                          -0.183
## original_chocolate_positive                            -0.107
## original_chocolate_fixtated                            -0.069
## original_chocolate_look_away                           -0.103
## original_chocolate_focused                             -0.124
## original_chocolate_negative                            -0.110
## original_chocolate_disgusting                          -0.065
## original_chocolate_appealing                            0.103
## original_chocolate_eye_catching                        -0.154
## original_chocolate_attractive                          -0.134
## original_chocolate_avoid_looking                       -0.064
##                                        classic_chocolate_pos_neg
## desirability_chocolate                                     0.036
## classic_chocolate_pos_neg                                  1.000
## classic_chocolate_pleasant_unpleasant                      0.350
## classic_chocolate_good_bad                                 0.368
## original_chocolate_like                                   -0.132
## original_chocolate_attention_capturing                    -0.237
## original_chocolate_unusual                                -0.009
## original_chocolate_figure_out                             -0.092
## original_chocolate_positive                               -0.072
## original_chocolate_fixtated                               -0.183
## original_chocolate_look_away                              -0.089
## original_chocolate_focused                                -0.111
## original_chocolate_negative                                0.069
## original_chocolate_disgusting                             -0.165
## original_chocolate_appealing                              -0.265
## original_chocolate_eye_catching                           -0.230
## original_chocolate_attractive                             -0.299
## original_chocolate_avoid_looking                          -0.076
##                                        classic_chocolate_pleasant_unpleasant
## desirability_chocolate                                                 0.121
## classic_chocolate_pos_neg                                              0.350
## classic_chocolate_pleasant_unpleasant                                  1.000
## classic_chocolate_good_bad                                             0.205
## original_chocolate_like                                               -0.059
## original_chocolate_attention_capturing                                -0.243
## original_chocolate_unusual                                             0.065
## original_chocolate_figure_out                                         -0.109
## original_chocolate_positive                                           -0.170
## original_chocolate_fixtated                                           -0.212
## original_chocolate_look_away                                          -0.006
## original_chocolate_focused                                            -0.189
## original_chocolate_negative                                            0.020
## original_chocolate_disgusting                                         -0.042
## original_chocolate_appealing                                          -0.129
## original_chocolate_eye_catching                                       -0.287
## original_chocolate_attractive                                         -0.321
## original_chocolate_avoid_looking                                      -0.025
##                                        classic_chocolate_good_bad
## desirability_chocolate                                      0.037
## classic_chocolate_pos_neg                                   0.368
## classic_chocolate_pleasant_unpleasant                       0.205
## classic_chocolate_good_bad                                  1.000
## original_chocolate_like                                    -0.112
## original_chocolate_attention_capturing                     -0.320
## original_chocolate_unusual                                 -0.004
## original_chocolate_figure_out                              -0.137
## original_chocolate_positive                                 0.026
## original_chocolate_fixtated                                -0.190
## original_chocolate_look_away                               -0.060
## original_chocolate_focused                                 -0.096
## original_chocolate_negative                                 0.236
## original_chocolate_disgusting                              -0.098
## original_chocolate_appealing                               -0.195
## original_chocolate_eye_catching                            -0.301
## original_chocolate_attractive                              -0.264
## original_chocolate_avoid_looking                           -0.038
##                                        original_chocolate_like
## desirability_chocolate                                   0.023
## classic_chocolate_pos_neg                               -0.132
## classic_chocolate_pleasant_unpleasant                   -0.059
## classic_chocolate_good_bad                              -0.112
## original_chocolate_like                                  1.000
## original_chocolate_attention_capturing                  -0.129
## original_chocolate_unusual                              -0.070
## original_chocolate_figure_out                           -0.161
## original_chocolate_positive                             -0.069
## original_chocolate_fixtated                             -0.187
## original_chocolate_look_away                            -0.010
## original_chocolate_focused                              -0.211
## original_chocolate_negative                              0.016
## original_chocolate_disgusting                            0.073
## original_chocolate_appealing                             0.081
## original_chocolate_eye_catching                         -0.256
## original_chocolate_attractive                           -0.256
## original_chocolate_avoid_looking                        -0.045
##                                        original_chocolate_attention_capturing
## desirability_chocolate                                                 -0.170
## classic_chocolate_pos_neg                                              -0.237
## classic_chocolate_pleasant_unpleasant                                  -0.243
## classic_chocolate_good_bad                                             -0.320
## original_chocolate_like                                                -0.129
## original_chocolate_attention_capturing                                  1.000
## original_chocolate_unusual                                              0.085
## original_chocolate_figure_out                                           0.159
## original_chocolate_positive                                            -0.122
## original_chocolate_fixtated                                             0.119
## original_chocolate_look_away                                           -0.064
## original_chocolate_focused                                              0.055
## original_chocolate_negative                                            -0.121
## original_chocolate_disgusting                                          -0.075
## original_chocolate_appealing                                           -0.113
## original_chocolate_eye_catching                                         0.355
## original_chocolate_attractive                                           0.045
## original_chocolate_avoid_looking                                       -0.110
##                                        original_chocolate_unusual
## desirability_chocolate                                      0.051
## classic_chocolate_pos_neg                                  -0.009
## classic_chocolate_pleasant_unpleasant                       0.065
## classic_chocolate_good_bad                                 -0.004
## original_chocolate_like                                    -0.070
## original_chocolate_attention_capturing                      0.085
## original_chocolate_unusual                                  1.000
## original_chocolate_figure_out                               0.211
## original_chocolate_positive                                -0.057
## original_chocolate_fixtated                                 0.264
## original_chocolate_look_away                               -0.167
## original_chocolate_focused                                  0.163
## original_chocolate_negative                                -0.133
## original_chocolate_disgusting                              -0.128
## original_chocolate_appealing                               -0.041
## original_chocolate_eye_catching                             0.051
## original_chocolate_attractive                              -0.043
## original_chocolate_avoid_looking                           -0.123
##                                        original_chocolate_figure_out
## desirability_chocolate                                        -0.183
## classic_chocolate_pos_neg                                     -0.092
## classic_chocolate_pleasant_unpleasant                         -0.109
## classic_chocolate_good_bad                                    -0.137
## original_chocolate_like                                       -0.161
## original_chocolate_attention_capturing                         0.159
## original_chocolate_unusual                                     0.211
## original_chocolate_figure_out                                  1.000
## original_chocolate_positive                                    0.021
## original_chocolate_fixtated                                    0.292
## original_chocolate_look_away                                  -0.119
## original_chocolate_focused                                     0.256
## original_chocolate_negative                                   -0.106
## original_chocolate_disgusting                                 -0.096
## original_chocolate_appealing                                  -0.069
## original_chocolate_eye_catching                                0.121
## original_chocolate_attractive                                 -0.001
## original_chocolate_avoid_looking                              -0.086
##                                        original_chocolate_positive
## desirability_chocolate                                      -0.107
## classic_chocolate_pos_neg                                   -0.072
## classic_chocolate_pleasant_unpleasant                       -0.170
## classic_chocolate_good_bad                                   0.026
## original_chocolate_like                                     -0.069
## original_chocolate_attention_capturing                      -0.122
## original_chocolate_unusual                                  -0.057
## original_chocolate_figure_out                                0.021
## original_chocolate_positive                                  1.000
## original_chocolate_fixtated                                 -0.050
## original_chocolate_look_away                                -0.049
## original_chocolate_focused                                  -0.058
## original_chocolate_negative                                  0.142
## original_chocolate_disgusting                               -0.009
## original_chocolate_appealing                                -0.093
## original_chocolate_eye_catching                             -0.224
## original_chocolate_attractive                               -0.073
## original_chocolate_avoid_looking                            -0.056
##                                        original_chocolate_fixtated
## desirability_chocolate                                      -0.069
## classic_chocolate_pos_neg                                   -0.183
## classic_chocolate_pleasant_unpleasant                       -0.212
## classic_chocolate_good_bad                                  -0.190
## original_chocolate_like                                     -0.187
## original_chocolate_attention_capturing                       0.119
## original_chocolate_unusual                                   0.264
## original_chocolate_figure_out                                0.292
## original_chocolate_positive                                 -0.050
## original_chocolate_fixtated                                  1.000
## original_chocolate_look_away                                -0.141
## original_chocolate_focused                                   0.433
## original_chocolate_negative                                 -0.212
## original_chocolate_disgusting                               -0.115
## original_chocolate_appealing                                -0.119
## original_chocolate_eye_catching                              0.131
## original_chocolate_attractive                                0.007
## original_chocolate_avoid_looking                            -0.138
##                                        original_chocolate_look_away
## desirability_chocolate                                       -0.103
## classic_chocolate_pos_neg                                    -0.089
## classic_chocolate_pleasant_unpleasant                        -0.006
## classic_chocolate_good_bad                                   -0.060
## original_chocolate_like                                      -0.010
## original_chocolate_attention_capturing                       -0.064
## original_chocolate_unusual                                   -0.167
## original_chocolate_figure_out                                -0.119
## original_chocolate_positive                                  -0.049
## original_chocolate_fixtated                                  -0.141
## original_chocolate_look_away                                  1.000
## original_chocolate_focused                                   -0.099
## original_chocolate_negative                                   0.174
## original_chocolate_disgusting                                 0.125
## original_chocolate_appealing                                 -0.012
## original_chocolate_eye_catching                              -0.078
## original_chocolate_attractive                                 0.074
## original_chocolate_avoid_looking                              0.363
##                                        original_chocolate_focused
## desirability_chocolate                                     -0.124
## classic_chocolate_pos_neg                                  -0.111
## classic_chocolate_pleasant_unpleasant                      -0.189
## classic_chocolate_good_bad                                 -0.096
## original_chocolate_like                                    -0.211
## original_chocolate_attention_capturing                      0.055
## original_chocolate_unusual                                  0.163
## original_chocolate_figure_out                               0.256
## original_chocolate_positive                                -0.058
## original_chocolate_fixtated                                 0.433
## original_chocolate_look_away                               -0.099
## original_chocolate_focused                                  1.000
## original_chocolate_negative                                -0.107
## original_chocolate_disgusting                              -0.055
## original_chocolate_appealing                               -0.162
## original_chocolate_eye_catching                             0.057
## original_chocolate_attractive                               0.019
## original_chocolate_avoid_looking                           -0.118
##                                        original_chocolate_negative
## desirability_chocolate                                      -0.110
## classic_chocolate_pos_neg                                    0.069
## classic_chocolate_pleasant_unpleasant                        0.020
## classic_chocolate_good_bad                                   0.236
## original_chocolate_like                                      0.016
## original_chocolate_attention_capturing                      -0.121
## original_chocolate_unusual                                  -0.133
## original_chocolate_figure_out                               -0.106
## original_chocolate_positive                                  0.142
## original_chocolate_fixtated                                 -0.212
## original_chocolate_look_away                                 0.174
## original_chocolate_focused                                  -0.107
## original_chocolate_negative                                  1.000
## original_chocolate_disgusting                                0.309
## original_chocolate_appealing                                -0.160
## original_chocolate_eye_catching                             -0.235
## original_chocolate_attractive                               -0.171
## original_chocolate_avoid_looking                             0.269
##                                        original_chocolate_disgusting
## desirability_chocolate                                        -0.065
## classic_chocolate_pos_neg                                     -0.165
## classic_chocolate_pleasant_unpleasant                         -0.042
## classic_chocolate_good_bad                                    -0.098
## original_chocolate_like                                        0.073
## original_chocolate_attention_capturing                        -0.075
## original_chocolate_unusual                                    -0.128
## original_chocolate_figure_out                                 -0.096
## original_chocolate_positive                                   -0.009
## original_chocolate_fixtated                                   -0.115
## original_chocolate_look_away                                   0.125
## original_chocolate_focused                                    -0.055
## original_chocolate_negative                                    0.309
## original_chocolate_disgusting                                  1.000
## original_chocolate_appealing                                   0.111
## original_chocolate_eye_catching                               -0.109
## original_chocolate_attractive                                  0.016
## original_chocolate_avoid_looking                               0.195
##                                        original_chocolate_appealing
## desirability_chocolate                                        0.103
## classic_chocolate_pos_neg                                    -0.265
## classic_chocolate_pleasant_unpleasant                        -0.129
## classic_chocolate_good_bad                                   -0.195
## original_chocolate_like                                       0.081
## original_chocolate_attention_capturing                       -0.113
## original_chocolate_unusual                                   -0.041
## original_chocolate_figure_out                                -0.069
## original_chocolate_positive                                  -0.093
## original_chocolate_fixtated                                  -0.119
## original_chocolate_look_away                                 -0.012
## original_chocolate_focused                                   -0.162
## original_chocolate_negative                                  -0.160
## original_chocolate_disgusting                                 0.111
## original_chocolate_appealing                                  1.000
## original_chocolate_eye_catching                               0.065
## original_chocolate_attractive                                 0.221
## original_chocolate_avoid_looking                              0.038
##                                        original_chocolate_eye_catching
## desirability_chocolate                                          -0.154
## classic_chocolate_pos_neg                                       -0.230
## classic_chocolate_pleasant_unpleasant                           -0.287
## classic_chocolate_good_bad                                      -0.301
## original_chocolate_like                                         -0.256
## original_chocolate_attention_capturing                           0.355
## original_chocolate_unusual                                       0.051
## original_chocolate_figure_out                                    0.121
## original_chocolate_positive                                     -0.224
## original_chocolate_fixtated                                      0.131
## original_chocolate_look_away                                    -0.078
## original_chocolate_focused                                       0.057
## original_chocolate_negative                                     -0.235
## original_chocolate_disgusting                                   -0.109
## original_chocolate_appealing                                     0.065
## original_chocolate_eye_catching                                  1.000
## original_chocolate_attractive                                    0.421
## original_chocolate_avoid_looking                                -0.062
##                                        original_chocolate_attractive
## desirability_chocolate                                        -0.134
## classic_chocolate_pos_neg                                     -0.299
## classic_chocolate_pleasant_unpleasant                         -0.321
## classic_chocolate_good_bad                                    -0.264
## original_chocolate_like                                       -0.256
## original_chocolate_attention_capturing                         0.045
## original_chocolate_unusual                                    -0.043
## original_chocolate_figure_out                                 -0.001
## original_chocolate_positive                                   -0.073
## original_chocolate_fixtated                                    0.007
## original_chocolate_look_away                                   0.074
## original_chocolate_focused                                     0.019
## original_chocolate_negative                                   -0.171
## original_chocolate_disgusting                                  0.016
## original_chocolate_appealing                                   0.221
## original_chocolate_eye_catching                                0.421
## original_chocolate_attractive                                  1.000
## original_chocolate_avoid_looking                               0.058
##                                        original_chocolate_avoid_looking
## desirability_chocolate                                           -0.064
## classic_chocolate_pos_neg                                        -0.076
## classic_chocolate_pleasant_unpleasant                            -0.025
## classic_chocolate_good_bad                                       -0.038
## original_chocolate_like                                          -0.045
## original_chocolate_attention_capturing                           -0.110
## original_chocolate_unusual                                       -0.123
## original_chocolate_figure_out                                    -0.086
## original_chocolate_positive                                      -0.056
## original_chocolate_fixtated                                      -0.138
## original_chocolate_look_away                                      0.363
## original_chocolate_focused                                       -0.118
## original_chocolate_negative                                       0.269
## original_chocolate_disgusting                                     0.195
## original_chocolate_appealing                                      0.038
## original_chocolate_eye_catching                                  -0.062
## original_chocolate_attractive                                     0.058
## original_chocolate_avoid_looking                                  1.000
# 
# # --- If unidimensionality is questionable: run a 2-factor exploratory bifactor or EFA
# # Exploratory 2-factor
# mod_2fE <- mirt(dat_ord, 2, itemtype = "graded", SE = FALSE, verbose = FALSE, pars = "values")
# summary(mod_2fE)

Other items

Using attention checks as a comparison

Retaining all exclusion criteria other than the attention checks

data_exclusions_partial <- data_processed |>
  filter(self_exclude == "passed" &
           bot_check == "passed" & 
           age_check == "passed" & 
           completeness_check == "passed" &
           completion_time_check == "passed")

repeated_measures_d(x = data_exclusions_partial$attention_check2_numeric,
                    y = data_exclusions_partial$attention_check1_numeric,
                    method = "av") |>
  select(-CI) |>
  mutate_if(is.numeric, round_half_up, digits = 2) |>
  kable() |>
  kable_classic(full_width = FALSE)
d_av CI_low CI_high
51.93 51.8 52.05
data_exclusions_partial |>
  summarize(mean_respondwith1 = mean(attention_check1_numeric),
            sd_respondwith1 = sd(attention_check1_numeric),
            mean_respondwith7 = mean(attention_check2_numeric),
            sd_respondwith7 = sd(attention_check2_numeric)) |>
  pivot_longer(cols = everything()) |>
  mutate(value = round_half_up(value, 2))
## # A tibble: 4 × 2
##   name              value
##   <chr>             <dbl>
## 1 mean_respondwith1  1   
## 2 sd_respondwith1    0.09
## 3 mean_respondwith7  6.99
## 4 sd_respondwith7    0.14
ggplot(data_exclusions_partial, aes(attention_check1_numeric)) +
  geom_histogram(boundary = 0.5, binwidth = 1) +
  scale_x_continuous(limits = c(0.5, 7.5), breaks = 1:7)

ggplot(data_exclusions_partial, aes(attention_check2_numeric)) +
  geom_histogram(boundary = 0.5, binwidth = 1) +
  scale_x_continuous(limits = c(0.5, 7.5), breaks = 1:7)

Others

Distributions

data_exclusions_reshaped_2 <- data_exclusions |>
  select(participant_id, 
         girls_skirts,
         boys_skirts,
         cats_legs,
         fish_legs,
         vacation,
         pedophile,
         love,
         murder,
         honest,
         dishonest,
         racist,
         shrewd,
         mcdonalds,
         burgerking,
         liberals,
         conservatives) |>
  pivot_longer(cols = -participant_id,
               names_to = "stimulus",
               values_to = "response") |>
  mutate(stimulus = fct_relevel(stimulus,
                                "girls_skirts",
                                "boys_skirts",
                                "cats_legs",
                                "fish_legs",
                                "vacation",
                                "pedophile",
                                "love",
                                "murder",
                                "honest",
                                "dishonest",
                                "racist",
                                "shrewd",
                                "mcdonalds",
                                "burgerking",
                                "liberals",
                                "conservatives"))

ggplot(data_exclusions_reshaped_2, aes(response)) +
  geom_histogram(boundary = 0.5, binwidth = 1) +
  scale_x_continuous(limits = c(0.5, 7.5), breaks = 1:7) +
  theme_linedraw() +
  facet_wrap( ~ stimulus)

data_exclusions_reshaped_2 |>
  group_by(stimulus) |>
  summarize(mean = mean(response),
            sd = sd(response)) |>
  mutate_if(is.numeric, round_half_up, digits = 2) |>
  kable() |>
  kable_classic(full_width = FALSE)
stimulus mean sd
girls_skirts 5.23 1.42
boys_skirts 1.94 1.03
cats_legs 6.81 0.66
fish_legs 1.06 0.25
vacation 6.53 0.77
pedophile 1.08 0.43
love 6.74 0.54
murder 1.10 0.42
honest 6.54 0.72
dishonest 1.51 0.74
racist 1.25 0.68
shrewd 4.24 1.59
mcdonalds 4.12 1.63
burgerking 4.09 1.57
liberals 4.10 1.57
conservatives 3.01 1.65

Session info

sessionInfo()
## R version 4.5.0 (2025-04-11)
## Platform: aarch64-apple-darwin20
## Running under: macOS Sequoia 15.6
## 
## Matrix products: default
## BLAS:   /Library/Frameworks/R.framework/Versions/4.5-arm64/Resources/lib/libRblas.0.dylib 
## LAPACK: /Library/Frameworks/R.framework/Versions/4.5-arm64/Resources/lib/libRlapack.dylib;  LAPACK version 3.12.1
## 
## locale:
## [1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
## 
## time zone: Europe/Zurich
## tzcode source: internal
## 
## attached base packages:
## [1] stats4    stats     graphics  grDevices utils     datasets  methods  
## [8] base     
## 
## other attached packages:
##  [1] mirt_1.44.0      lattice_0.22-6   ggstance_0.3.7   purrr_1.1.0     
##  [5] tibble_3.3.0     lavaan_0.6-19    janitor_2.2.1    kableExtra_1.4.0
##  [9] knitr_1.50       psych_2.5.3      effectsize_1.0.0 forcats_1.0.1   
## [13] scales_1.4.0     ggplot2_4.0.0    tidyr_1.3.1      dplyr_1.1.4     
## [17] readr_2.1.5     
## 
## loaded via a namespace (and not attached):
##  [1] mnormt_2.1.1         pbapply_1.7-4        gridExtra_2.3       
##  [4] testthat_3.2.3       permute_0.9-7        sandwich_3.1-1      
##  [7] rlang_1.1.6          magrittr_2.0.4       multcomp_1.4-28     
## [10] snakecase_0.11.1     compiler_4.5.0       mgcv_1.9-1          
## [13] systemfonts_1.2.3    vctrs_0.6.5          quadprog_1.5-8      
## [16] stringr_1.5.2        pkgconfig_2.0.3      crayon_1.5.3        
## [19] fastmap_1.2.0        labeling_0.4.3       pbivnorm_0.6.0      
## [22] utf8_1.2.6           rmarkdown_2.30       sessioninfo_1.2.3   
## [25] tzdb_0.5.0           bit_4.6.0            xfun_0.53           
## [28] cachem_1.1.0         jsonlite_2.0.0       Deriv_4.1.6         
## [31] parallel_4.5.0       cluster_2.1.8.1      R6_2.6.1            
## [34] bslib_0.9.0          stringi_1.8.7        RColorBrewer_1.1-3  
## [37] parallelly_1.45.1    brio_1.1.5           lubridate_1.9.4     
## [40] jquerylib_0.1.4      estimability_1.5.1   Rcpp_1.1.0          
## [43] future.apply_1.20.0  zoo_1.8-14           audio_0.1-11        
## [46] parameters_0.27.0    R.utils_2.13.0       Matrix_1.7-3        
## [49] splines_4.5.0        timechange_0.3.0     tidyselect_1.2.1    
## [52] rstudioapi_0.17.1    yaml_2.3.10          vegan_2.7-1         
## [55] codetools_0.2-20     dcurver_0.9.2        listenv_0.9.1       
## [58] withr_3.0.2          bayestestR_0.16.1    S7_0.2.0            
## [61] coda_0.19-4.1        evaluate_1.0.5       future_1.67.0       
## [64] survival_3.8-3       xml2_1.4.0           pillar_1.11.1       
## [67] insight_1.4.0.8      generics_0.1.4       vroom_1.6.6         
## [70] hms_1.1.3            globals_0.18.0       xtable_1.8-4        
## [73] glue_1.8.0           emmeans_1.11.2-8     tools_4.5.0         
## [76] beepr_2.0            SimDesign_2.19.2     mvtnorm_1.3-3       
## [79] grid_4.5.0           datawizard_1.1.0     nlme_3.1-168        
## [82] cli_3.6.5            textshaping_1.0.3    viridisLite_0.4.2   
## [85] svglite_2.2.1        gtable_0.3.6         R.methodsS3_1.8.2   
## [88] sass_0.4.10          digest_0.6.37        progressr_0.15.1    
## [91] GPArotation_2025.3-1 TH.data_1.1-3        farver_2.1.2        
## [94] htmltools_0.5.8.1    R.oo_1.27.1          lifecycle_1.0.4     
## [97] bit64_4.6.0-1        MASS_7.3-65